package com.forever.sl;

import org.apache.commons.lang.RandomStringUtils;

public class ToShortUrl {

	public static String changtoShortUrl(String url, String key) {
		// 要应用生成 URL 的字符
		String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p",
				"q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
				"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
				"U", "V", "W", "X", "Y", "Z" };
		// 对传入网址进行 MD5 加密
		DirectMD5 md5 = new DirectMD5();
		String sMD5EncryptResult = md5.getKeyedDigest(url + System.currentTimeMillis(), key);
		String hex = sMD5EncryptResult;

		String[] resUrl = new String[4];
		// 获得 4组短链接字符串
		for (int i = 0; i < 4; i++) {
			// 把加密字符遵守 8 位一组 16 进制与 0 x3FFFFFFF 进行位与运算
			String sTempSubString = hex.substring(i * 8, i * 8 + 8);

			// 这里须要应用 long 型来转换，因为 Inteper .parseInt（） 只能处理惩罚 31 位 ， 首位为符号位 ，
			// 若是不消 long ，则会越界
			long lHexLong = 0x3FFFFFFF & Long.parseLong(sTempSubString, 16);
			String outChars = "";
			// 轮回获得 每组6位的字符串
			for (int j = 0; j < 6; j++) {
				// 把获得的值与 0 x0000003D 进行位与运算，取得字符数组 chars 索引
				// （具体须要看chars数组的长度 以防下标溢出，重视出发点为0）
				long index = 0x0000003D & lHexLong;
				// 把取得的字符相加
				outChars += chars[(int) index];
				// 每次轮回按位右移 5 位
				lHexLong = lHexLong >> 5;
			}
			// 把字符串存入对应索引的输出数组
			resUrl[i] = outChars;
		}
		String random = RandomStringUtils.random(1, "0123");
		return resUrl[Integer.parseInt(random)];
	}

	public static void main(String[] args) {
		String url = ToShortUrl.changtoShortUrl("http://baidu.com", "forever");
		System.out.println(url);
	}
}